import { login, logout, getInfo } from '@/api/user'
import store from '../index'
import {
	getToken,
	setToken,
	removeToken,
	setRoles,
	getRoles,
	removeRoles,
	setUserInfo,
	getUserInfo,
	removeUserInfo
} from '@/utils/auth'
import router, { resetRouter } from '@/router'

const userInfo = getUserInfo()

const state = {
	token: getToken(),
	name: userInfo.name ? userInfo.name : '',
	avatar: userInfo.avatar ? userInfo.avatar : '',
	roles: getRoles()
}

const mutations = {
	SET_TOKEN: (state, token) => {
		state.token = token
	},
	SET_NAME: (state, name) => {
		state.name = name
	},
	SET_AVATAR: (state, avatar) => {
		state.avatar = avatar
	},
	SET_ROLES: (state, roles) => {
		state.roles = roles
	}
}

const actions = {
	// user login
	login({ commit }, userInfo) {
		const { phone, passwd } = userInfo
		return new Promise((resolve, reject) => {
			login({ phone: phone.trim(), passwd: passwd })
				.then(response => {
					const { data } = response
					commit('SET_TOKEN', data.accessToken)
					commit('SET_ROLES', data.accessNode)
					commit('SET_NAME', data.name)
					commit('SET_AVATAR', data.avatar)
					setToken(data.accessToken)
					setRoles(data.accessNode)
					setUserInfo({ name: data.name, avatar: data.avatar })
					resolve()
				})
				.catch(error => {
					reject(error)
				})
		})
	},

    guest({ commit }, userInfo) {
        console.log('guest', userInfo)
    	const { phone, passwd } = userInfo
    	return new Promise((resolve, reject) => {
            // debugger
            let response = {
                data: {
                    accessToken: 'GUEST-2022-01-13-0001',
                    accessNode: ['guest'],
                    name: 'guest',
                    avatar: 'https://dancea.oss-cn-shenzhen.aliyuncs.com/upload/avatar/f89b9433b73cec1d.jpg?x-oss-process=style/avatar3',
                }
            }
    		const { data } = response
    		commit('SET_TOKEN', data.accessToken)
    		commit('SET_ROLES', data.accessNode)
    		commit('SET_NAME', data.name)
    		commit('SET_AVATAR', data.avatar)
    		setToken(data.accessToken)
    		setRoles(data.accessNode)
    		setUserInfo({ name: data.name, avatar: data.avatar })
    		resolve()
    	})
    },

	// get user info
	getInfo({ commit, state }) {
		return new Promise((resolve, reject) => {
			getInfo(state.token)
				.then(response => {
					const { data } = response

					if (!data) {
						reject('Verification failed, please Login again.')
					}

					const { roles, name, avatar } = data

					// roles must be a non-empty array
					if (!roles || roles.length <= 0) {
						reject('getInfo: roles must be a non-null array!')
					}

					commit('SET_ROLES', roles)
					commit('SET_NAME', name)
					commit('SET_AVATAR', avatar)
					resolve(data)
				})
				.catch(error => {
					reject(error)
				})
		})
	},

	// user logout
	logout({ commit, state, dispatch }) {
		return new Promise((resolve, reject) => {
            if (state.name == 'guest') {
                commit('SET_TOKEN', '')
                commit('SET_ROLES', [])
                commit('SET_NAME', '')
                commit('SET_AVATAR', '')
                removeToken()
                removeRoles()
                removeUserInfo()
                resetRouter()
                store.commit('permission/SET_ROUTES', [])
                                
                // reset visited views and cached views
                // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                dispatch('tagsView/delAllViews', null, { root: true })
                                
                resolve()
            } else {
                logout(state.token)
                	.then(() => {
                		commit('SET_TOKEN', '')
                		commit('SET_ROLES', [])
                		commit('SET_NAME', '')
                		commit('SET_AVATAR', '')
                		removeToken()
                		removeRoles()
                		removeUserInfo()
                		resetRouter()
                		store.commit('permission/SET_ROUTES', [])
                
                		// reset visited views and cached views
                		// to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                		dispatch('tagsView/delAllViews', null, { root: true })
                
                		resolve()
                	})
                	.catch(error => {
                		reject(error)
                	})
            }
			
		})
	},

	// remove token
	resetToken({ commit }) {
		return new Promise(resolve => {
			commit('SET_TOKEN', '')
			commit('SET_ROLES', [])
			commit('SET_NAME', '')
			commit('SET_AVATAR', '')
			removeToken()
			removeRoles()
			removeUserInfo()
			resolve()
		})
	},

	// dynamically modify permissions
	async changeRoles({ commit, dispatch }, role) {
		const token = role + '-token'

		commit('SET_TOKEN', token)
		setToken(token)

		const { roles } = await dispatch('getInfo')

		resetRouter()

		// generate accessible routes map based on roles
		const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
		// dynamically add accessible routes
		router.addRoutes(accessRoutes)

		// reset visited views and cached views
		dispatch('tagsView/delAllViews', null, { root: true })
	}
}

export default {
	namespaced: true,
	state,
	mutations,
	actions
}
